import java.util.*;

/**
 * @ClassName ColoringEdges
 * @auther mjlf
 * @Date 2019/9/9 15:17
 * @Description TODO
 */
public class ColoringEdges {

    public static Scanner scanner = new Scanner(System.in);
    public static int max = 1;

    public static void main(String[] args) {
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        Node[] nodes = new Node[n+1];
        int[][] mm = new int[m][2];
        for (int i = 0; i < m; i++) {
            int num = scanner.nextInt();
            int next = scanner.nextInt();
            if (nodes[num] == null) {
                nodes[num] = new Node();
                nodes[num].setNum(num);
            }
            nodes[num].getNexts().add(next);
            mm[i][0] = num;
            mm[i][1] = next;
        }
        int[][] nn = new int[n+1][n+1];

        int currentColor = 1;
        for (int i = 1; i <= n; i++) {
            Map<Integer, Boolean> route = new HashMap<>();
            dfs(nodes, nn, i, route, currentColor);
        }

        System.out.println(max);
        for(int i = 0; i < m - 1; i ++){
            System.out.print(nn[mm[i][0]][mm[i][1]] + " ");
        }
        System.out.println(nn[mm[m-1][0]][mm[m-1][1]]);
    }

    public static void dfs(Node[] nodes, int[][] nn, int i, Map<Integer, Boolean> route, int currentColor) {
        if (nodes[i] != null) {
            if (nodes[i].getNexts() == null || nodes[i].getNexts().size() == 0) {
                return;
            }

            if (nodes[i].isSucceed()) {
                return;
            }

            //放到路上
            route.put(i, true);

            List<Integer> nexts = nodes[i].getNexts();
            for (int next : nexts) {
                //表示在路上
                if(route.containsKey(next)){
                    nn[i][next] = currentColor + 1;
                    if(max < currentColor + 1){
                        max = currentColor + 1;
                    }
                }else {
                    nn[i][next] = currentColor;
                    dfs(nodes, nn, next, route, currentColor);
                }
            }
            nodes[i].setSucceed(true);
            route.remove(i);
        }
    }

    static class Node {
        private int num;
        private List<Integer> nexts = new ArrayList<>();
        private boolean succeed;

        public int getNum() {
            return num;
        }

        public void setNum(int num) {
            this.num = num;
        }

        public List<Integer> getNexts() {
            return nexts;
        }

        public void setNexts(List<Integer> nexts) {
            this.nexts = nexts;
        }

        public boolean isSucceed() {
            return succeed;
        }

        public void setSucceed(boolean succeed) {
            this.succeed = succeed;
        }
    }
}
